import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.TreeSet;

/**
 * 学生类：存储姓名和分数，实现Comparable接口用于排序
 */
class Student implements Comparable<Student> {
	private String name;  // 学生姓名
	private double score; // 学生分数

	public Student(String name, double score) {
		this.name = name;
		this.score = score;
	}

	public String getName() {
		return name;
	}

	public double getScore() {
		return score;
	}

	/**
	 * 排序规则：
	 * 1. 按分数降序（分数高的在前）
	 * 2. 分数相同则按姓名升序（避免TreeSet判定为重复元素）
	 */
	@Override
	public int compareTo(Student other) {
		// 先比较分数（降序）
		int scoreCompare = Double.compare(other.score, this.score);
		if (scoreCompare != 0) {
			return scoreCompare;
		}
		// 分数相同则比较姓名（升序）
		return this.name.compareTo(other.name);
	}

	/**
	 * 重写toString，方便显示学生信息
	 */
	@Override
	public String toString() {
		return String.format("%-8s  %.1f分", name, score); // 左对齐姓名，保持格式整齐
	}
}

/**
 * 主界面类：实现成绩排名功能
 */
public class ScoreRankingApp extends JFrame {
	private JTextField nameInput;    // 姓名输入框
	private JTextField scoreInput;   // 分数输入框
	private JTextArea resultArea;    // 结果显示区
	private TreeSet<Student> students; // 存储学生的有序集合（自动排序）

	public ScoreRankingApp() {
		students = new TreeSet<>(); // 初始化TreeSet（自动按规则排序）
		initUI(); // 初始化界面
		setTitle("学生成绩排名");
		setSize(500, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null); // 窗口居中显示
	}

	/**
	 * 初始化界面组件
	 */
	private void initUI() {
		// 主面板：使用边界布局
		JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
		mainPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

		// 输入面板：存放姓名和分数输入框
		JPanel inputPanel = new JPanel(new GridLayout(2, 2, 10, 10));
		inputPanel.add(new JLabel("学生姓名："));
		nameInput = new JTextField(15);
		inputPanel.add(nameInput);

		inputPanel.add(new JLabel("成绩（0-100）："));
		scoreInput = new JTextField(15);
		inputPanel.add(scoreInput);

		// 按钮面板：存放添加按钮
		JPanel buttonPanel = new JPanel();
		JButton addBtn = new JButton("添加并更新排名");
		addBtn.setFont(new Font("宋体", Font.PLAIN, 14));
		addBtn.addActionListener(new AddButtonListener());
		buttonPanel.add(addBtn);

		// 结果显示区：带滚动条的文本区
		resultArea = new JTextArea();
		resultArea.setFont(new Font("宋体", Font.PLAIN, 14));
		resultArea.setEditable(false); // 禁止编辑
		JScrollPane scrollPane = new JScrollPane(resultArea);
		scrollPane.setBorder(BorderFactory.createTitledBorder("排名结果（按成绩降序）"));

		// 组装面板
		mainPanel.add(inputPanel, BorderLayout.NORTH);
		mainPanel.add(buttonPanel, BorderLayout.CENTER);
		mainPanel.add(scrollPane, BorderLayout.SOUTH);

		add(mainPanel);
	}

	/**
	 * 添加按钮的事件监听器：处理输入、验证、添加学生并更新显示
	 */
	private class AddButtonListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			// 1. 获取输入内容
			String name = nameInput.getText().trim();
			String scoreStr = scoreInput.getText().trim();

			// 2. 验证输入合法性
			if (name.isEmpty()) {
				JOptionPane.showMessageDialog(ScoreRankingApp.this,
						"请输入学生姓名！", "输入错误", JOptionPane.WARNING_MESSAGE);
				nameInput.requestFocus(); // 焦点回到姓名输入框
				return;
			}

			double score;
			try {
				score = Double.parseDouble(scoreStr);
				if (score < 0 || score > 100) {
					JOptionPane.showMessageDialog(ScoreRankingApp.this,
							"分数必须在0-100之间！", "输入错误", JOptionPane.WARNING_MESSAGE);
					scoreInput.selectAll(); // 选中分数输入框内容，方便修改
					return;
				}
			} catch (NumberFormatException ex) {
				JOptionPane.showMessageDialog(ScoreRankingApp.this,
						"请输入有效的数字分数！", "输入错误", JOptionPane.WARNING_MESSAGE);
				scoreInput.selectAll();
				return;
			}

			// 3. 添加学生到TreeSet（自动排序）
			students.add(new Student(name, score));

			// 4. 清空输入框，准备下次输入
			nameInput.setText("");
			scoreInput.setText("");
			nameInput.requestFocus(); // 焦点回到姓名输入框

			// 5. 更新排名显示
			updateResultDisplay();
		}
	}

	/**
	 * 更新结果显示区：按排名顺序展示所有学生
	 */
	private void updateResultDisplay() {
		StringBuilder sb = new StringBuilder();
		sb.append("排名\t姓名\t\t分数\n");
		sb.append("-----------------------------------\n");

		int rank = 1;
		for (Student student : students) {
			sb.append(rank++).append("\t").append(student).append("\n");
		}

		resultArea.setText(sb.toString());
	}

	/**
	 * 主方法：启动应用程序
	 */
	public static void main(String[] args) {
		// 在事件调度线程中启动GUI，确保线程安全
		SwingUtilities.invokeLater(() -> {
			new ScoreRankingApp().setVisible(true);
		});
	}
}